#include "Net.hpp"
#include "Unit.hpp"
#include "Dispatch.hpp"
#include "Client/Rpc_Caller.hpp"
void MessageCallBack(const Abstract::BaseConnection::ConPtr &Con, const Abstract::BaseMessage::MesaPtr &Mptr)
{
    std::string body = Mptr->Serialize();
    std::string uuid = Mptr->GetUuid();
    std::cout << "接收的消息:" << body << std::endl;
}

void RbCallBack(const Json::Value & result)
{
    ELOG("进入Rpc回应的回调处理函数");
    std::cout<<result["Res"].asInt()<<std::endl;
}
int main()
{
    // 1 构造消息分发模块
    std::shared_ptr<Dispactch> DispPtr = std::make_shared<Dispactch>();

    // 2 构造Request模块负责实际的请求发送和接收响应进行处理
    auto Request = std::make_shared<Client::Resquestor>();

    // 3 构造RpcCallPtr模块基于Request模块发送Rpc请求和接收Rpc回应
    auto RpcCallPtr = std::make_shared<Rpc_Caller>(Request);

    // 4 注册实际处理回应的回调函数给消息分发模块
    DispPtr->RegisterHander(Rs_RqType::RPC_Res,
                            [Request](const Abstract::BaseConnection::ConPtr &Con, const Abstract::BaseMessage::MesaPtr &Mptr)
                            {
                                Request->DealResponce(Con, Mptr);
                            });

    // 当客户端创建出来时其内部已经创建一个epoll线程去监听就绪事件了
    auto sptr = Net::BulidMuduoClient::build("127.0.0.1", 8080);
    // 注册epoll线程收到消息时的回调处理函数
    sptr->SetReady_CallBack(
        [&DispPtr](const Abstract::BaseConnection::ConPtr &Con, const Abstract::BaseMessage::MesaPtr &Mptr)
        {
            DispPtr->MessageCallback(Con, Mptr);
        });                // 设置服务端接收一条完整
    sptr->ConnectServer(); // 连接服务端，连接之前设置回调函数
    // 构建一条rpc请求对象
    Json::Value paras;
    paras["nums1"] = 6;
    paras["nums2"] = 2;

    // // 构建一条主题请求信息的正文部分
    // auto TopicRequest = Message::BuildMessage::build<Message::TopicRequest>();
    // TopicRequest->SetMtype(Rs_RqType::TOPIC_Req);
    // TopicRequest->SetUuid(UUID::uuid());
    // TopicRequest->SetTopic("Music");
    // TopicRequest->SetTopOper(TopicOperType::Topic_SubScribe);

    Json::Value paras1;
    paras["nums1"] = 60;
    paras["nums2"] = 20;
    std::future<Abstract::BaseMessage::MesaPtr>  RpcFuture;
    std::string uuid;
    while (true) // 主线程负责发送消息
    {
        sleep(3);
        //Json::Value result;
        //std::future<Json::Value> result;
        //RpcCallPtr->call(sptr->GetConnection(), "Add", paras, result,uuid); // 发送Rpc请求时异步等待监听线程把Rpc回应交给promisse对象
        RpcCallPtr->call(sptr->GetConnection(), "Add", paras,uuid,RbCallBack);//基于用户传入的回调函数异步处理响应
        for(int i=0;i<5;i++)
        {
            DLOG("异步获取Rpc回应中");
            sleep(1);
        }
        //Json::Value Re=result.get();
        //std::cout <<"服务端计算的结果:"<< Re["Res"].asInt() << std::endl;
        //RpcCallPtr->DelRequestDesc(uuid);
    }
}